'''
 己方棋子编码约定:
	1司令,2军长,3师长,4旅长,5团长,6营长,7连长,8排长,9工兵,10地雷，11炸弹,12军旗
 对方方棋子编码约定:
    14军旗 13未知对方棋子
    0空棋位
'''

import numpy as np
from basic import *
import reasoning
import simulate

probTable={}

class chess_map:
    def __init__(self):
        self.map = np.zeros((12, 5), dtype=np.int32)
        self.ene_map = {}  # 存储敌方棋子编号->棋子类型的dict
        # 产生一个可放置的棋子序列，打乱 （不包含大本营）
        self.chess_list = []
        self.my_chess_list = []  # 记录我方棋子坐标 cMap上的编号
        self.ene_chess_list = []  # 记录敌方棋子坐标 cMap上的编号
        self.random_init()

    def locate_army_flag(self, i, j, army_flag):
        # 已经判断是大本营 决定放不放军旗
        if army_flag:  # 必须放置军旗
            self.map[i][j] = 12
        if j == 3 and self.map[i][1] == 12:  # 之前放过军旗了
            self.map[i][j] = self.chess_list[0]
            self.chess_list = np.delete(self.chess_list, 0)
            return
        if j == 3 and self.map[i][1] != 12:
            self.map[i][j] = 12
            return
        else:  # 不必须放置军旗
            x = np.random.randint(0, 2)
            if x:  # 在这里放置军旗（x>0)
                self.map[i][j] = 12
                army_flag = False
            else:
                self.map[i][j] = self.chess_list[0]
                self.chess_list = np.delete(self.chess_list, 0)
                army_flag = True

    def locate_chess(self, i, j, army_flag):  # 查看该位置能不能放棋子，并从队首取出一个棋子进行放置

        # 优先放置军旗
        if IsBaseCamp(i, j):
            self.locate_army_flag(i, j, army_flag)

        # 不用放置军旗
        elif IsMoveCamp(i, j):
            return

        else:
            self.map[i][j] = self.chess_list[0]
            if self.chess_list.shape[0] > 1:
                self.chess_list = np.delete(self.chess_list, 0)

    def init_chess_list(self):
        chessman = np.array([0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 1])  # 棋子下标对应的棋子数量
        self.chess_list = []
        for i in range(1, 10):  # 将编号为1-9（除了炸弹、地雷、军旗）的棋子按照数量放入序列中
            for j in range(chessman[i]):
                self.chess_list.append(i)
        self.chess_list = np.array(self.chess_list, dtype=np.int32)
        np.random.shuffle(self.chess_list)

        # 为了保证后两排有地雷，要让地雷放在前9个
        index = np.random.randint(0, 9, 3)
        dilei_list = np.array([10, 10, 10])  # 生成三个地雷编号棋子 随机和前面9个棋子中任意三个进行交换
        self.chess_list[index], dilei_list = dilei_list, self.chess_list[index]
        self.chess_list = np.append(self.chess_list, dilei_list)

        # 为了保证后五排有炸弹，要让炸弹放在前19个
        index = np.random.randint(9, 19, 2)
        zhadan_list = np.array([11, 11])  # 生成两个炸弹编号棋子 随机和前面19个棋子中任意2个进行交换
        self.chess_list[index], zhadan_list = zhadan_list, self.chess_list[index]
        self.chess_list = np.append(self.chess_list, zhadan_list)
        # print(self.chess_list)

    def change_ene_code(self):
        # 将放置好的敌方棋子转换为编号
        # 将编号->棋子类型存储在self.ene_map中
        id = 1

        for i in range(6):
            for j in range(5):
                if self.map[i][j] != 0:
                    # 创建概率表列
                    probObj = reasoning.enemyProb(probTable,self.map[i][j])
                    if i > 1:  # 不是后两排，不是地雷
                        probObj.setZeroRaw(reasoning.dilei)
                    elif not IsBaseCamp(i, j):  # 不在大本营，不是军旗
                        probObj.setZeroRaw(reasoning.junqi)
                    probTable[id] = probObj

                    self.ene_map[id] = self.map[i][j]  # 将编号->棋子类型存储在self.ene_map中
                    self.map[i][j] = id
                    id += 1

    def random_init(self):

        # 初始化敌方棋子
        army_flag = False  # 是否需要现在放置军旗
        self.init_chess_list()
        for i in range(6):
            for j in range(5):
                self.locate_chess(i, j, army_flag)
                if self.map[i][j] != 0:
                    self.ene_chess_list.append((i, j))

        self.change_ene_code()  # 将放置好的敌方棋子转换为编号

        # 初始化我方棋子
        self.init_chess_list()
        for i in range(11, 5, -1):
            for j in range(5):
                self.locate_chess(i, j, army_flag)
                if self.map[i][j] != 0:
                    self.my_chess_list.append((i, j))



